slicelistmodel: Fix two wrong computations
authorBenjamin Otte <otte@redhat.com>
Fri, 14 Feb 2020 02:13:49 +0000 (03:13 +0100)
committerBenjamin Otte <otte@redhat.com>
Fri, 14 Feb 2020 02:15:22 +0000 (03:15 +0100)
Both of those are thinkos during math.
Found by Mohammed Sadiq.

Testcases triggering both have been added.

gtk/gtkslicelistmodel.c
testsuite/gtk/slicelistmodel.c

index a6aa4f3b7f9f7f5d58afc2d69a207d10fa5b8b31..b8ceb0d0c5eb609f5e8001ff729e08d5c5e15c02 100644 (file)
@@ -133,7 +133,7 @@ gtk_slice_list_model_items_changed_cb (GListModel        *model,
   if (position < self->offset)
     {
       guint skip = MIN (removed, added);
-      skip = MIN (skip, position - self->offset);
+      skip = MIN (skip, self->offset - position);
 
       position += skip;
       removed -= skip;
@@ -149,7 +149,7 @@ gtk_slice_list_model_items_changed_cb (GListModel        *model,
 
       g_assert (position >= self->offset);
       position -= self->offset;
-      changed = MIN (changed, self->size) - position;
+      changed = MIN (changed, self->size - position);
 
       g_list_model_items_changed (G_LIST_MODEL (self), position, changed, changed);
     }
index 48619c4f8259e78ff0d51c25a9a6994f9f39ab14..c3ae685c5935135453aeef2c79cd898f2658f44f 100644 (file)
@@ -322,6 +322,44 @@ test_changes (void)
   g_object_unref (slice);
 }
 
+static void
+test_bug_added_equals_removed (void)
+{
+  GtkSliceListModel *slice;
+  GListStore *store;
+  
+  store = new_store (1, 10, 1);
+  slice = new_model (store, 0, 10);
+  assert_model (slice, "1 2 3 4 5 6 7 8 9 10");
+  assert_changes (slice, "");
+
+  splice (store, 9, 1, (guint[]) { 11 }, 1);
+  assert_model (slice, "1 2 3 4 5 6 7 8 9 11");
+  assert_changes (slice, "9-1+1");
+
+  g_object_unref (store);
+  g_object_unref (slice);
+}
+
+static void
+test_bug_skip_amount (void)
+{
+  GtkSliceListModel *slice;
+  GListStore *store;
+  
+  store = new_store (1, 5, 1);
+  slice = new_model (store, 2, 2);
+  assert_model (slice, "3 4");
+  assert_changes (slice, "");
+
+  splice (store, 0, 5, (guint[]) { 11, 12, 13, 14, 15 }, 5);
+  assert_model (slice, "13 14");
+  assert_changes (slice, "0-2+2");
+
+  g_object_unref (store);
+  g_object_unref (slice);
+}
+
 int
 main (int argc, char *argv[])
 {
@@ -338,6 +376,8 @@ main (int argc, char *argv[])
 #if GLIB_CHECK_VERSION (2, 58, 0) /* g_list_store_splice() is broken before 2.58 */
   g_test_add_func ("/slicelistmodel/changes", test_changes);
 #endif
+  g_test_add_func ("/slicelistmodel/bug/added_equals_removed", test_bug_added_equals_removed);
+  g_test_add_func ("/slicelistmodel/bug/skip_amount", test_bug_skip_amount);
 
   return g_test_run ();
 }